import axios from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useUserStore } from '@/stores/user'
import router from '@/router'

// 创建axios实例
const service = axios.create({
  baseURL: '/api', // api的base_url
  timeout: 60000 // 请求超时时间
})

// request拦截器
service.interceptors.request.use(
  config => {
    const userStore = useUserStore()
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`
    }
    return config
  },
  error => {
    console.log(error)
    Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    // 处理不同的响应格式
    // 如果响应状态码是200，直接返回数据
    if (response.status === 200) {
      // 如果有code字段，按照原逻辑处理
      if (res.hasOwnProperty('code')) {
        if (res.code !== 200 && res.code !== 0) {
          ElMessage({
            message: res.message || 'Error',
            type: 'error',
            duration: 5 * 1000
          })

          // 401: 未登录
          if (res.code === 401 || res.code === 40100) {
            ElMessageBox.confirm('你已被登出，可以取消继续留在该页面，或者重新登录', '确定登出', {
              confirmButtonText: '重新登录',
              cancelButtonText: '取消',
              type: 'warning'
            }).then(() => {
              const userStore = useUserStore()
              userStore.fedLogOut().then(() => {
                router.push('/login')
              })
            })
          }
          return Promise.reject(new Error(res.message || 'Error'))
        }
        return res
      } else {
        // 如果没有code字段，直接返回数据（适配简单的API响应）
        return {
          code: 200,
          data: res,
          message: 'success'
        }
      }
    }
    
    return res
  },
  error => {
    console.log('err' + error)
    let message = error.message
    
    // 处理HTTP状态码错误
    if (error.response) {
      switch (error.response.status) {
        case 401:
          message = '未授权，请重新登录'
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = '请求错误，未找到该资源'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = `连接错误${error.response.status}`
      }
    } else {
      message = '连接到服务器失败'
    }
    
    ElMessage({
      message: message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service